 
const vnodeToTemplate = new Map()
const templateToVNode = new Map()
 
/**
 * 预备渲染
 * @param {*} vm 
 * @param {*} vnode 
 * @returns 
 */
export function prepareRender(vm, vnode) {
    if(!vnode) return
    if(vnode.nodeType === 1) { // 元素节点
        vnode.children.forEach(childVNode => {
            prepareRender(vm, childVNode)
        })
    }
    if(vnode.nodeType === 3) { // 文本节点()
        analysisTemplateString(vnode)
    }
}
 
/**
 * 函数analysisTemplateString用于分析模板字符串
 * @param {*} vnode 
 */
function analysisTemplateString(vnode) {
    // 获取文本里面的模板
    const templateString = vnode.text.match(/{{[a-zA-Z0-9_.]+}}/g)
    if(templateString) {
        // 遍历获取到的模板
        templateString.forEach(template => {
            // 设置VNode到模板的映射关系
            setVnodeToTemplate(template, vnode)
            // 设置模板到VNode的映射关系
            setTemplateToVnode(template, vnode)
        })
    }
}
 
function setVnodeToTemplate(template, vnode) {
    template = getTemplateName(template)
    // 如果存在VNode
    if(vnodeToTemplate.has(vnode)) {
        vnodeToTemplate.get(vnode).push(template)
    } else { // 如果不存在VNode
        vnodeToTemplate.set(vnode, [template])
    }
}
 
function setTemplateToVnode(template, vnode) {
    template = getTemplateName(template)
    // 如果存在VNode
    if(templateToVNode.has(template)) {
        templateToVNode.get(template).push(vnode)
    } else { // 如果不存在VNode
        templateToVNode.set(template, [vnode])
    }
}
 
function getTemplateName(template) {
    return template.replace(/{{|}}/g, '');
}
 
export function getVnodeByTemplate() {
    return templateToVNode
}
 
export function getTemplateToVnode() {
    return vnodeToTemplate
}